<?php

/*
 * Copyright 2008 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#namespace tehframework\objects\propertyeditors;

#use tehframework\objects\PropertyEditor;

class IntegerEditor extends PropertyEditor
{
	/**
	 * @var bool
	 */
	protected $countObjects = true;
	
	/**
	 * @var bool
	 */
	protected $countArrays = false;
	
	/**
	 * @param bool? $countObjects
	 * @param bool? $countArrays
	 */
	public function __construct($countObjects = null, $countArrays = null)
	{
		$this->countObjects = $countObjects === null ? true : (bool)$countObjects;
		$this->countArrays  = (bool)$countArrays;
	}
	
	/**
	 * @param  bool $countObjects
	 * @return IntegerEditor
	 */
	public function setCountObjects($countObjects)
	{
		$this->countObjects = (bool)$countObjects;
		
		return $this;
	}
	
	/**
	 * @param  bool $countArrays
	 * @return IntegerEditor
	 */
	public function setCountArrays($countArrays)
	{
		$this->countArrays = (bool)$countArrays;
		
		return $this;
	}
	
	/**
	 * Edits the given property so that it meets this editor's format.
	 * 
	 * Result depends on a type of the given {@link $propertyValue value}:
	 * - string:
	 *   if string is numeric, its casted to int, otherwise 0.
	 * - object:
	 *   if {@link $countObjects} is TRUE and object implements Countable
	 *   interface, returns a result of count() method, otherwise 0.
	 * - array:
	 *   if {@link $countArrays} is TRUE, returns a number of elements in that
	 *   array, otherwise 0.
	 * - null:
	 *   always 0.
	 * - boolean:
	 *   1 if TRUE, otherwise 0.
	 * - resource:
	 *   always 0.
	 * - integer:
	 *   just returns the specified value.
	 * - float:
	 *   float casted to int.
	 * 
	 * @param  mixed $propertyValue
	 *         A value to be edited.
	 * @return string
	 *         A {@link $propertyValue value} converted to integer.
	 */
	public function editProperty($propertyValue)
	{
		switch (gettype($propertyValue))
		{
			case 'object':
				return $this->countObjects && ($propertyValue instanceof Countable)
					? count($propertyValue) : 0;
			
			case 'array':
				return $this->countArrays ? count($propertyValue) : 0;
			
			case 'NULL':
			case 'resource':
				return 0;
			
			case 'boolean':
				return $propertyValue ? 1 : 0;
			
			default:
				return (int)$propertyValue;
		}
	}
}